# -*- coding: utf-8 -*-

import SimpleHTTPServer
import SocketServer
import csv
import sqlite3
import os
import urllib2
from BeautifulSoup import BeautifulSoup
import webbrowser
from subprocess import call

def create_DB():
    '''
    cria a base de dados
    '''
    #apaga a BD se ela existir, isto para que os dados não fiquem repetidos
    cmd_rm= "rm -rf " + "{0}".format(os.getcwd()) + "/reb.db"
    os.system(cmd_rm)
    try:       
        conn = sqlite3.connect('reb.db')
        create_Table(conn)
    
        for ano in range(0, 11): 
            insert_Data(ano, conn)
            pass
        conn.close()
    except:
        print "Erro a Criar a BD!"
        pass
    pass

def create_Table(conn):
    '''
    apaga a tabela e cria uma nova
    '''    
    conn.execute('''create table docentes
                        (cod_docente integer, nome text, grau text,
                        curso text, categoria text,regime text, ano text,
                        tipo_estabelecimento text, nome_estabelecimento text)''')
    conn.commit()
    pass

def insert_Data(ano, conn):
    '''
    insere os dados na BD a partir do CSV
    '''
    try:
        ficheiro = open('reb{0}.csv'.format(ano),"rb")
        csvreader = csv.reader( ficheiro, delimiter=',')
        csvreader.next()
        #a instrução replace vai servir para evitar um erro de codificação dos dados
        for row in csvreader:    
            conn.execute('''insert into docentes values( \
                            "{0}","{1}","{2}","{3}","{4}","{5}","{6}", \
                            "{7}","{8}")'''.format(row[0].replace('"', ' '), \
                                                   row[1].replace('"', ' '), \
                                                   row[2].replace('"', ' '), \
                                                   row[3].replace('"', ' '), \
                                                   row[4].replace('"', ' '), \
                                                   row[5].replace('"', ' '), \
                                                   row[6].replace('"', ' '), \
                                                   row[7].replace('"', ' '), \
                                                   row[8].replace('"', ' ')))
            pass
        conn.commit()
        ficheiro.close()
        print "CSV {0} processado com Sucesso!".format(ano)
    except:
        print "Erro a inserir os dados na BD!"
        pass
    pass

def load_List():
    '''
    carrega os dados da BD para a lista
    '''
    lista=[]
    try:
        conn = sqlite3.connect('reb.db')
        curs = conn.cursor()
        curs.execute('select * from docentes')
        count = 0
        #como a BD é enorme e para não tornar a aplicação muito pesada só é carregado
        #50 000 dados, para que sejam carregados todos basta remover o contador
        for row in curs:
            if count == 50000:
                break
            lista.append(row)
            count += 1
            pass
        curs.close()
    except:
        print "Erro a carregar a BD!"
        pass
    return lista

def write_Html(stat, lista):
    '''
    guarda num ficherio html uma tabela com os dados das estatisticas
    '''
    try:
        ficheiro = open('rebEst_{0}.html'.format(stat),"wb")
        ficheiro.write("<html>\n\t<head>\n\t\t<title>BD Rebides</title>\n\t</head>")
        ficheiro.write("\n\t<body>\n\t\t<h1>Docentes Ensino Superior</h1>")
        ficheiro.write("\n\t\t<table border='1' id='Tabela' width='100%'>")
        ficheiro.write("\n\t\t<tr>")
        #para cada estatistica o cabeçalho da tabela é diferente
        if stat == 1:
            ficheiro.write("\n\t\t\t<th>Nome Estabelecimento</th>\n\t\t\t<th>Ano</th>")
            ficheiro.write("\n\t\t\t<th>N Professores</th>")
        elif stat == 2:
            ficheiro.write("\n\t\t\t<th>Categoria</th>\n\t\t\t<th>Nome Estabelecimento</th>")
            ficheiro.write("\n\t\t\t<th>Ano</th>\n\t\t\t<th>N Professores</th>")
        else:
            ficheiro.write("\n\t\t\t<th>Grau</th>\n\t\t\t<th>Nome Estabelecimento</th>")
            ficheiro.write("\n\t\t\t<th>Ano</th>\n\t\t\t<th>N Professores</th>")
            pass
        ficheiro.write("\n\t\t</tr>")
        #escreve os dados na tabela se for string a codificação é diferente
        for x in lista:         
            ficheiro.write("\n\t\t<tr>")  
            for i in x:
                if type(i) is int:
                    ficheiro.write("\n\t\t\t<td>{0}</td>".format((i)))
                else:
                    ficheiro.write("\n\t\t\t<td>{0}</td>".format((i).encode('utf-8')))
                pass
            ficheiro.write("\n\t\t</tr>")
            pass
        ficheiro.write("\n\t\t</table>")
        ficheiro.write("\n\t</body>")
        ficheiro.write("\n\t</html>")
        ficheiro.close()
    except:
        print "Erro a criar o ficheiro HTML!"       
        pass
    pass
    
def Start_HTTP_Server():
    '''
    cria o servidor HTTP no localhost na porta 8000 para poder aceder aos HTMLs
    '''
    try:
        #o servidor é criado a partir da shell do linux isto para que a aplicação
        #não fique bloqueada, depois é aberto o browser já com o endereço do localhost
        call("konsole -e python -m SimpleHTTPServer 8000", shell=True)
        webbrowser.open_new("http://127.0.0.1:8000")      
    except:
        print "Erro a criar o Servidor!"
        pass
    pass

def write_csv(stat, lista):
    '''
    escreve os dados de uma lista num ficheiro csv
    '''
    try:
        ficheiro = open('rebEst_{0}.csv'.format(stat),"wb")
        csvwriter = csv.writer( ficheiro, delimiter=',')
        #para cada estatistica o cabeçalho dd CSV é diferente
        if stat == 1:
            csvwriter.writerow(("Nome Estabelecimento","Ano","N Professores"))
        elif stat == 2:
            csvwriter.writerow(("Categoria","Nome Estabelecimento","Ano","N Professores"))
        else:
            csvwriter.writerow(("Grau","Nome Estabelecimento","Ano","N Professores"))    
            pass
        #a primeira estatistica tem 3 colunas logo é inserido de maneira diferente
        if stat == 1:
            for x in lista:
                csvwriter.writerow(((x[0]).encode('utf-8'),(x[1]).encode('utf-8'),x[2]))
                pass
        else:
            for x in lista:
                csvwriter.writerow(((x[0]).encode('utf-8'),(x[1]).encode('utf-8'),\
                                    (x[2]).encode('utf-8'),x[3]))
                pass
            pass
        ficheiro.close()
    except:
        print "Erro a criar o ficheiro CSV!"             
        pass
    pass

def countHtmlTags(url):  
    '''
    Conta as tags html de um respectivo site e guardas numa lista
    '''        
    try:
        #abre a conexão para a página html
        ficheiro = urllib2.urlopen( url )
    except:
        print "Erro de conexão!", url
        pass
    try:
        #lê os dados do página html
        dados = ficheiro.read()
    except:
        print "Erro de Leitura!"
        pass
    else:
        ficheiro.close()

    #processamento dos dados da página html
    lista = []
    listaRes = []
    listaTags = ['h1','h2','h3','div','p','ul','ol']
    soup = BeautifulSoup(dados)
    #procura através do BeautifulSoup as tags na página html e guarda as na lista 
    lista.append(soup.findAll(listaTags[0], ))
    lista.append(soup.findAll(listaTags[1], ))
    lista.append(soup.findAll(listaTags[2], ))
    lista.append(soup.findAll(listaTags[3], ))
    lista.append(soup.findAll(listaTags[4], ))
    lista.append(soup.findAll(listaTags[5], ))
    lista.append(soup.findAll(listaTags[6], ))
    i = 0
    for x in lista:
        #cria a lista com as tags e as vezes que elas surgiram na página html
        listaRes.append((listaTags[i], len(x)))
        i += 1
        pass     
    return listaRes







    


